package com.itheima.health.service.impl;

import com.itheima.health.dao.*;
import com.itheima.health.exception.BusinessRuntimeException;
import com.itheima.health.pojo.*;
import com.itheima.health.service.MobileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 移动服务impl
 * PROJECT_NAME: teamwork-health-system
 * NAME: MobileServiceImpl
 * USER: zhang
 * DATE: 2023/6/6
 * DESCRIPTION :
 *
 * @author YAN6D9N6SH3N6
 * @date 2023/06/06 18:19:35
 */
@Slf4j
@Service
public class MobileServiceImpl implements MobileService {
    /**
     * 注入移动端持久层接口
     */
    @Resource
    private MobileDao mobileDao;
    /**
     * 套餐检查组关联持久层接口
     */
    @Resource
    private SetmealCheckGroupDao setmealCheckGroupDao;
    /**
     * 注入检查组持久层接口
     */
    @Resource
    private CheckGroupDao checkGroupDao;
    /**
     * 注入检查组检查项关联持久层接口
     */
    @Resource
    private CheckGroupCheckitemDao checkGroupCheckitemDao;
    /**
     * 检查项持久层
     */
    @Resource
    private CheckItemDao checkItemDao;
    /**
     * 注入会员信息持久层接口
     */
    @Resource
    private MenberDao menberDao;
    /**
     * 注入预约单持久层接口
     */
    @Resource
    private OrderDao orderDao;
    /**
     * 注入套餐持久层
     */
    @Resource
    private SetMealDao setMealDao;

    /**
     * 查询全部套餐
     *
     * @return 全局通用返回信息Bean(套餐集合)
     */
    @Override
    public List<Setmeal> selectAllSetmeal() {
        //调用持久层查询全部套餐信息
        return mobileDao.selectAllSetmeal();
    }

    /**
     * 根据套餐Id查看套餐详情
     *
     * @param id 套餐Id
     * @return 全局通用返回信息Bean(Setmeal)
     */
    @Override
    public Setmeal selectSetmealById(Integer id) {
        //在关联表中基于套餐Id查询检查组Id
        List<Integer> checkGroupIds = setmealCheckGroupDao.selectCheckGroupIdBySetmealId(id);
        //根据套餐Id查询套餐基本信息
        Setmeal setmeal = mobileDao.selectSetmealById(id);
        //用于封装检查组基本信息的List集合
        ArrayList<CheckGroup> checkGroups = new ArrayList<>();
        //遍历checkGroupIds集合得到每一个检查组Id
        for (Integer checkGroupId : checkGroupIds) {
            //根据检查组Id查询检查组基本信息
            CheckGroup checkGroup = checkGroupDao.selectById(checkGroupId);
            //将每一个检查组基本信息添加到检查组List集合中
            checkGroups.add(checkGroup);
        }
        //封装检查组集合到Setmeal对象中去
        setmeal.setCheckGroups(checkGroups);
        //在setmeal中获取检查组集合，遍历获取到每一个检查组
        setmeal.getCheckGroups().forEach(checkGroup -> {
            //根据检查组Id查询检查项Id
            List<Integer> checkItemIds = checkGroupCheckitemDao.selectCheckitemIdByCheckgroupId(checkGroup.getId());
            //用于封装检查项基本信息List集合
            ArrayList<CheckItem> checkItemList = new ArrayList<>();
            //遍历检查项Ids集合，得到每一个检查项Id
            for (Integer checkItemId : checkItemIds) {
                //根据检查项Id查询检查项基本信息
                CheckItem checkItem = checkItemDao.selectCheckitemById(checkItemId);
                //添加检查项基本信息到检查项基本信息List集合中
                checkItemList.add(checkItem);
            }
            //封装检查项基本信息集合到检查组中
            checkGroup.setCheckItems(checkItemList);
        });
        return setmeal;
    }

    /**
     * 提交预约
     *
     * @param orderDTO 预约信息
     * @return {@link Order} 预约订单信息
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Order submit(OrderDTO orderDTO) {
        //创建会员对象,用于会员创建
        Member member = new Member();

        //判断验证码
        //TODO:校验验证码是否正确

        //判断是否添加预约日期
        if (Objects.isNull(orderDTO.getOrderDate())) {
            throw new BusinessRuntimeException("没有选择预约时间,请选择后再进行预约!");
        }

        //TODO:同一用户同一天同一个套餐不能预约功能

        //判断用户是否注册会员
        if (Objects.isNull(menberDao.getMenber(
                Member.builder()
                        .phoneNumber(orderDTO.getTelephone())
                        .build()))
        ) {
            //没有注册先注册会员
            member = Member.builder()
                    .name(orderDTO.getName())
                    .sex(orderDTO.getSex())
                    .idCard(orderDTO.getIdCard())
                    .phoneNumber(orderDTO.getTelephone())
                    .regTime(new Date())
                    .build();
            menberDao.insertMenber(member);
        }
        log.info("ad{}",member);
        //封装order数据
        Order order = Order.builder()
                .memberId(member.getId())
                .orderDate(orderDTO.getOrderDate())
                .orderStatus(Order.ORDERSTATUS_NO)
                .orderType(Order.ORDERTYPE_WEIXIN)
                .setmealId(orderDTO.getSetmealId())
                .build();
        //将封装的数据添加到数据库
        orderDao.insertOrder(order);

        return order;
    }

    /**
     * 通过id查询预约信息
     *
     * @param id 预约单id
     * @return {@link OrderVO}
     */
    @Override
    public OrderVO getAllOrder(Integer id) {
        //根据预约单id查询预约信息
        Order order = orderDao.getOrder(id);
        //根据查询信息中的会员id查询会员信息
        log.info("1123");
        Member member = menberDao.getMenber(Member.builder().id(order.getMemberId()).build());
        log.info("123{}",member);
        //根据查询信息查询套餐信息
        Setmeal setmeal = setMealDao.getSetmeal(Setmeal.builder().id(order.getSetmealId()).build());
        log.info("456{}",setmeal);
        return OrderVO.builder()
                .orderType(order.getOrderType())
                .member(member.getName())
                .orderDate(order.getOrderDate())
                .setmeal(setmeal.getName())
                .build();
    }
}
